package servidor;

import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;

public class BancoDeDados {
	ArrayList<Registro> registros = new ArrayList<Registro>();
	String senha = "mc823";
	String arquivo = "src/servidor/registers.bd";
	String separador = ":";
	
	public BancoDeDados() {
		String line;
		String[] campos;
					
		try {
			InputStream is = new FileInputStream(arquivo);
			
			BufferedReader br = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
			while ((line = br.readLine()) != null) {
				campos = line.split(separador);
				registros.add(new Registro(campos[0], campos[1], campos[2], campos[3], campos[4], campos[5], Integer.parseInt(campos[6])));
			}
			
			br.close();
			br = null;
			is = null;
		} catch (FileNotFoundException e) {
			e.printStackTrace();	
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void writeDados() throws IOException{
		BufferedWriter bw = new BufferedWriter(new FileWriter(arquivo));
		
		for(Registro r : registros){
			bw.write(r.titulo + this.separador);
			bw.write(r.autores + this.separador);
			bw.write(r.descricao + this.separador);
			bw.write(r.editora + this.separador);
			bw.write(r.ano_publicacao + this.separador);
			bw.write(r.isbn + this.separador);
			bw.write(r.num_exemplares + "\n");
		}
		
		bw.close();
	}
	
	public void listaTitulos(){
		for(Registro r : registros){
			System.out.println(r.isbn + " | " + r.titulo);
		}
	}
	
	public void imprimeDescricao(String isbn){
		boolean encontrou=false;
		
		for(Registro r : registros){
			if(r.isbn.equals(isbn)){
				encontrou=true;
				System.out.println(r.descricao);
				break;
			}
		}
		if(!encontrou){
			System.out.println("Registro não encontrado.");
		}
	}
	
	public void imprimeDadosLivro(String isbn){
		
		boolean encontrou=false;
		for(Registro r : registros){
			if(r.isbn.equals(isbn)){
				encontrou=true;
				System.out.println(r.isbn);
				System.out.println(r.titulo);
				System.out.println(r.autores);
				System.out.println(r.descricao);
				System.out.println(r.editora);
				System.out.println(r.ano_publicacao);
				System.out.println(r.num_exemplares);
				break;
			}
		}
		if(!encontrou){
			System.out.println("Registro não encontrado.");
		}
	}
	
	public void imprimeDadosGeral(){
		for(Registro r : registros){
			System.out.println(r.isbn);
			System.out.println(r.titulo);
			System.out.println(r.autores);
			System.out.println(r.descricao);
			System.out.println(r.editora);
			System.out.println(r.ano_publicacao);
			System.out.println(r.num_exemplares + "\n");
			
		}
	}

	public void alteraEstoqueLivro(String isbn, String senha, int novo_estoque ){
		
		if(!senha.equals(this.senha)){
			System.out.println("Senha invalida.");
		}else if(novo_estoque < 0){
			System.out.println("Novo estoque invalido.");
		}else{
			boolean encontrou = false;
			for(Registro r : registros){
				if(r.isbn.equals(isbn)){
					encontrou=true;
					r.setNum_exemplares(novo_estoque);
					try {
						this.writeDados();
						System.out.println("Registro alterado com sucesso.");
					} catch (IOException e) {
						e.printStackTrace();
						System.exit(1);
					}
					break;
				}
			}
			if(!encontrou){
				System.out.println("Registro não encontrado.");
			}
		}
		
	}
	
	public void verificaEstoqueLivro(String isbn){

		boolean encontrou=false;
		
		for(Registro r : registros){
			if(r.isbn.equals(isbn)){
				encontrou=true;
				System.out.println(r.num_exemplares);
				break;
			}
		}
		if(!encontrou){
			System.out.println("Registro não encontrado.");
		}
	}
	
	public String getIsbnInput() {
		BufferedReader br = new BufferedReader(new InputStreamReader (System.in));
		String isbn=null;
		try {
			isbn = br.readLine();
			while(isbn.length()!=10 || !isbn.matches("[0-9]+")){
				System.out.println("ISBN inválido. Tente novamente.");
				isbn = br.readLine();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(1);
		}
		return isbn;
	}
	
	public String getSenhaInput(){
		BufferedReader br = new BufferedReader(new InputStreamReader (System.in));
		String senha=null;
		try {
			senha = br.readLine();			
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(1);
		}
		return senha;
	}
	
	public int getEstoqueInput(){
		BufferedReader br = new BufferedReader(new InputStreamReader (System.in));
		int estoque=-1;
		try {
			estoque = Integer.parseInt(br.readLine());
			while(estoque<0){
				System.out.println("Estoque inválido. Tente novamente.");
				estoque = Integer.parseInt(br.readLine());
			}
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(1);
		}
		return estoque;
	}
}